如何建立安全的 Web 网站
主机操作系统是Web的直接支撑者,合理配置主机系统,能为Web服务器提供强健的安全支持。
1.配置主机操作系统
(1)仅仅提供必要的服务
已经安装完毕的操作系统都有一系列常用的服务,UNIX系统将提供Finger、Rwho、RPC、LPD、Sendmail、FTP、NFS、IP转发等服务。Windows 2003 Server系统将提供RPC(远程过程调用)IP转发、FTP、SMTP等。而且,系统在默认的情况下自动启用这些服务,或提供简单易用的配置向导。这些配置简单的服务应用在方便管理员而且增强系统功能的同时,也埋下了安全隐患。因为,关于这些应用服务的说明文档或是没有足够的提醒,或是细碎繁杂使人无暇细研,不熟练的管理员甚至没有认真检查这些服务的配置是否清除了已知的安全隐患。
为此,在安装操作系统时,应该只选择安装必要的协议和服务;对于UNIX系统,应检查/etc/rc.d/目录下的各个目录中的文件,删除不必要的文件;对于Windows系统,应删除没有用到的网络协议,不要安装不必要的应用软件。一般情况下,应关闭Web服务器的IP转发功能。
系统功能越单纯,结构越简单,可能出现的漏洞越少,因此越容易进行安全维护。对于专门提供Web信息服务(含提供虚拟服务器)的网站,最好由专门的主机作Web服务器系统,对外只提供Web服务,没有其他任务。这样,可以保证:使系统最好地为Web服务提供支持、管理人员单一,避免发生管理员之间出现安全漏洞、用户访问单一,便于控制、日志文件较少,减轻系统负担。
对于必须提供其他服务,如FTP服务与Web服务共用文件空间,即FTP和HTTP共享目录,则必须仔细设置各个目录、文件的访问权限,确保远程用户无法上传通过Web服务所能读取或执行的文件。
(2)使用必要的辅助工具,简化主机的安全管理
启用系统的日志(系统账户日志和Web服务器日志)记录功能。监视并记录访问企图是主机安全的一个重要机制,以利于提高主机的一致性以及其数据保密性。
UNIX 系统,可以在服务器上安装 tcp_wrapper 工具。它在其他网络服务启动之前首先启动。tcp_wrapper的配置文件可以控制只有本主机上的用户才可以使用登录(Telnet)本服务器。
Windows系统提供端口访问控制功能,有助于加强Web服务器的安全。在网络→协议→TCP/IP属性→高级,选用“启用安全机制” → 配置,将出现窗口。选择“仅允许”,便可以利用“添加”功能,设置允许访问的端口。
2.合理配置Web服务器
① 在UNIX OS中,以非特权用户而不是Root身份运行Web服务器。
② 设置Web服务器访问控制。通过IP地址控制、子网域名来控制,未被允许的IP地址、IP子网域发来的请求将被拒绝。
③ 通过用户名和口令限制。只有当远程用户输入正确的用户名和口令的时候,访问才能被正确响应。
④ 用公用密钥加密方法。对文件的访问请求和文件本身都将加密,以便只有预计的用户才能读取文件内容。
3.设置Web服务器有关目录的权限
为了安全起见,管理员应对“文档根目录”(HTML 文件存放的位置)和“服务器根目录”(日志文件和配置文件存放的位置)做严格的访问权限控制。
① 服务器根目录下存放日志文件、配置文件等敏感信息,它们对系统的安全至关重要,不能让用户随意读取或删改。
② 服务器根目录下存放CGI脚本程序,用户对这些程序有执行权限,恶意用户有可能利用其中的漏洞进行越权操作,例如,增、删、改。
③ 服务器根目录下的某些文件需要由Root来写或者执行,如Web服务器需要Root来启动,如果其他用户对Web服务器的执行程序有写权限,则该用户可以用其他代码替换掉Web服务器的执行程序,当Root 再次执行这个程序时,用户设定的代码将以Root身份运行。
4.网页高效编程
现在Web制作技术日趋复杂,再加上网页编程人员大多使用自己或第三方开发的软件,而这些软件有的就没有考虑安全问题,这就造成了很多Web站点存在着极为严重的安全问题。电子世界中充斥着由于主页制作人员投机取巧而给攻击者留下侵袭或破坏服务器的残留物。
(1)输入验证机制不足
如果验证提供给特定脚本的输入有效性上存在不足,攻击者很有可能作为一个参数提交一个特殊字符和一个本地命令,让Web服务器在本地执行。如果程序盲目地接受来自Web 页面的输入并用外壳命令传递它,就可能为试图攻入网络的黑客提供访问权。 当一段代码(如CGI程序或SSI代码)被欺骗执行了一个外壳命令时,这个外壳命令会按照与程序本身同样的访问级别来执行。所以要确保使用尽可能有限的访问权限来运行CGI程序和Web服务器,并加强输入验证机制杜绝有危害的字符送入Web应用程序。另外我们还可以增加对输出数据流的检验,这样即使万一被攻破,也不至于流失重要数据。
(2)不缜密的编程思路
网站设计考虑不周,常常会给Web 站点留下后患。例如,把内部应用状态的数据通过< INPUT TYPE=”HIDDEN” >标记从一个页面传递到另一个页面,攻击者可以轻易地引导该应用并得到任何想要的结果。一般的解决方案是把应用状态通过会话变量保存在服务器上,很多Web开发平台都有这种机制,如在PHP3中用PHPLIB保存会话数据;在PHP4中用Session()调用;ASP也提供Session对象,Cold Fusion还提供了几种不同的会话变量。
(3)客户端执行代码乱用
新兴的动态编程技术允许把代码转移到客户端执行,以缓解服务器的压力。Java 脚本就能完成这一目的,它可以使Web 页面更加生动,同时提高更多的控制。但在已发现的漏洞中,覆盖面也很广,如发送电子邮件、查看历史文件记录表、跟踪用户在线情况以及上传客户的文件。这样很容易泄露用户的个人隐私。
与Java不同,Cookie只是一些数据而不是程序,因此无法运行。客户端访问页面时,服务器不但发送所请求的页面,还有一些额外数据,当客户端和服务器再次建立连接时,回送这些Cookie以简化连接过程,提供更方便的服务。当然Cookie中包含的数据也可能是病毒的源代码甚至经过编译的二进制代码,不过远程激活它们比较困难,Cookie 真正的问题也是隐私方面,这也是自它诞生以来争论的焦点。
解决的方案,我们除了期望网站设计安全以外,也可以在访问不确定安全的网站时,关闭浏览器的Java及Cookie支持功能以避免受到伤害。
5.安全管理Web服务器
Web服务器的日常管理、维护工作包括Web服务器的内容更新,日志文件的审计,安装一些新的工具、软件,更改服务器配置,对Web进行安全检查等。主要注意以下几点。
以安全的方式更新Web服务器(尽量在服务器本地操作)。
经常审查有关日志记录。
进行必要的数据备份。
定期对Web服务器进行安全检查。
冷静处理意外事件。